
package com.jf.cloud.order.service;

import com.jf.cloud.api.order.bo.EsOrderRefundBO;
import com.jf.cloud.api.order.vo.AccountOrderDetailVO;
import com.jf.cloud.api.order.vo.OrderRefundProdEffectRespVO;
import com.jf.cloud.api.order.vo.OrderRefundSimpleVO;
import com.jf.cloud.api.order.vo.PageShopAccountOrderVO;
import com.jf.cloud.api.vo.EsPageVO;
import com.jf.cloud.common.database.dto.PageDTO;
import com.jf.cloud.common.database.vo.PageVO;
import com.jf.cloud.common.order.bo.RefundNotifyBO;
import com.jf.cloud.common.order.dto.OrderRefundSearchDTO;
import com.jf.cloud.common.order.vo.EsOrderRefundVO;
import com.jf.cloud.common.response.ServerResponseEntity;
import com.jf.cloud.order.dto.multishop.OrderRefundDTO;
import com.jf.cloud.order.model.Order;
import com.jf.cloud.order.model.OrderRefund;
import com.jf.cloud.order.model.OrderRefundAddr;
import com.jf.cloud.order.vo.OrderRefundVO;

import java.util.Date;
import java.util.List;

/**
 * 订单退款记录信息
 *
 * @author zz
 * @date 2020-12-05 14:13:50
 */
public interface OrderRefundService {

    /**
     * 分页获取订单退款记录信息列表
     * @param pageDTO 分页参数
     * @param orderRefundPageDTO
     * @return 订单退款记录信息列表分页数据
     */
    EsPageVO<EsOrderRefundVO> page(PageDTO pageDTO, OrderRefundSearchDTO orderRefundPageDTO);

    /**
     * 根据订单退款记录信息id获取订单退款记录信息
     *
     * @param refundId 订单退款记录信息id
     * @return 订单退款记录信息
     */
    OrderRefundVO getByRefundId(Long refundId);

    /**
     * 根据订单退款记录信息id获取订单退款记录信息 详情，包括订单项，订单信息等
     *
     * @param refundId 订单退款记录信息id
     * @return 订单退款记录信息
     */
    OrderRefundVO getDetailByRefundId(Long refundId);

    /**
     * 保存订单退款记录信息
     * @param orderRefund 订单退款记录信息
     */
    void save(OrderRefund orderRefund);

    /**
     * 更新订单退款记录信息
     * @param orderRefund 订单退款记录信息
     */
    void update(OrderRefund orderRefund);

    /**
     * 获取该退款单号是否为最后一个订单项
     * @param refundSn
     * @param shopId
     * @return
     */
    Boolean getIsLastRefund(Long refundSn, Long shopId);

    /**
     * 根据订单退款记录信息id删除订单退款记录信息
     * @param refundId
     */
    void deleteById(Long refundId);

    /**
     * 校验订单是否在退款时间内，是否可以进行申请退款
     * @param order 订单信息
     * @return
     */
    boolean checkRefundDate(Order order);

    /**
     * 根据订单id，获取正在退款中或退款成功的订单
     * @param orderId
     * @return
     */
    List<OrderRefund> getProcessOrderRefundByOrderId(Long orderId);

    /**
     * 生成退款单
     * @param orderRefund 退款对象
     */
    void applyRefund(OrderRefund orderRefund);

    /**
     * 虚拟订单直接退款
     * @param orderRefundDTO
     */
    void applyRefundByUnreal(OrderRefundDTO orderRefundDTO);

    /**
     * 买家提交物流信息
     * @param orderRefund 退款单对象
     * @param orderRefundAddr 退款物流单对象
     */
    void submitExpress(OrderRefund orderRefund, OrderRefundAddr orderRefundAddr);

    /**
     * 获取订单正在进行退款的退款数量
     * @param returnMoneySts
     * @param returnMoneySts2
     * @param orderId
     * @return
     */
    Integer countByReturnMoneyStsAndOrderId(Integer returnMoneySts, Integer returnMoneySts2, Long orderId);

    /**
     * 订单退款成功处理
     * @param refundNotifyBO
     */
    void refundSuccess(RefundNotifyBO refundNotifyBO);

    /**
     * 用户取消退款
     * @param orderRefundVO
     */
    void cancelRefund(OrderRefundVO orderRefundVO);

    /**
     * 商家拒绝退款
     * @param orderRefundParam
     * @param orderRefundVo
     */
    void disagreeRefund(OrderRefundDTO orderRefundParam, OrderRefundVO orderRefundVo);

    /**
     * 移交供应商处理，改变下状态即可
     * @param orderRefundParam
     * @param orderRefundVo
     */
    void transferRefundOrderToSupplier(OrderRefundDTO orderRefundParam, OrderRefundVO orderRefundVo);

    /**
     * 商家同意退货，并返回一个退货地址
     * @param orderRefundParam
     * @param orderRefundVo
     * @param sysType
     */
    void agreeReturns(OrderRefundDTO orderRefundParam, OrderRefundVO orderRefundVo, Integer sysType);

    /**
     * 同意退款
     * @param orderRefundVO
     * @param orderRefundParam
     * @return 是否成功
     */
    int agreeRefund(OrderRefundVO orderRefundVO, OrderRefundDTO orderRefundParam);

    /**
     * 商家同意退款
     *
     * @param orderRefundParam
     * @param orderRefundVo
     * @return
     */
    ServerResponseEntity<Void> agreeRefund(OrderRefundDTO orderRefundParam, OrderRefundVO orderRefundVo);

    /**
     * 获取退款状态
     * @param refundId
     * @return
     */
    Integer getRefundStatus(Long refundId);

    /**
     * 创建未曾团而退款的团购订单
     * @param refundNotifyBO 退款
     */
    void createGroupUnSuccessRefundInfo(RefundNotifyBO refundNotifyBO);

    /**
     * 通过订单id获取正在处理中的退款订单
     * @param orderId 订单id
     * @return 正在处理中的退款订单
     */
    List<OrderRefundVO> getProcessingOrderRefundByOrderId(Long orderId);

    /**
     * 获取订单的移交供应商处理的状态
     * @param orderId 订单id
     * @return 移交供应商处理的状态
     */
    Integer getSupplierHandleStatusByOrderId(Long orderId);

    /**
     * 根据参数获取商品退款订单数据分析
     * @param spuIds 商品id列表
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 商品退款订单数据
     */
    List<OrderRefundProdEffectRespVO> getProdRefundEffectByDateAndProdIds(List<Long> spuIds, Date startTime, Date endTime);

    /**
     * 根据订单id及退款状态，获取订单退款信息
     * @param orderId 订单id
     * @param returnMoneySts 退款状态
     * @return 订单退款数据列表
     */
    List<com.jf.cloud.api.order.vo.OrderRefundVO> getOrderRefundByOrderIdAndRefundStatus(Long orderId, Integer returnMoneySts);
    /**
     * 根据退款单号列表获取订单号列表
     * @param refundIds
     * @return
     */
    List<OrderRefundSimpleVO> listOrderIdsByRefundIds(List<Long> refundIds);

//    /**
//     * 获取退款超时的订单
//     * @param date 超时时间
//     * @return 退款订单
//     */
//    List<OrderRefundVO> listOrderRefundTimeOut(Date date);

    /**
     * 处理的超时申请的退款订单
     * @param refundIds 超时退款订单id列表
     */
    void cancelWhenTimeOut(List<Long> refundIds);

    /**
     * 退款信息
     * @param refundId 退款编号
     * @return 获取退款信息
     */
    com.jf.cloud.api.order.vo.OrderRefundVO getOrderRefundByRefundId(Long refundId);

    /**
     * 获取退款成功总数
     * @param orderId
     * @return
     */
    int countSuccessItemNum(Long orderId);

    /**
     * 获取mongodb和es的退款订单信息
     *
     * @param refundId
     * @return
     */
    EsOrderRefundBO saveMongoAndGetEsOrderRefundInfo(Long refundId);

    /**
     * 用户退款订单列表查询
     * @param pageDTO
     * @param orderRefundSearchDTO
     * @return
     */
    PageVO<OrderRefundVO> userOrderRefundPage(PageDTO pageDTO, OrderRefundSearchDTO orderRefundSearchDTO);

    /**
     * 获取财务对账信息
     * @param startTime
     * @param endTime
     * @param shopName
     * @param shopId
     * @return
     */
    AccountOrderDetailVO getAccountOrderDetail(Date startTime, Date endTime, String shopName, Long shopId);

    /**
     * 获取店铺财务对账信息
     * @param startTime
     * @param endTime
     * @param shopName
     * @param pageSize
     * @param pageNum
     * @return
     */
    PageShopAccountOrderVO listShopAccountDetail(Date startTime, Date endTime, String shopName, Integer pageSize, Integer pageNum);

    /**
     * 获取店铺财务对账详情
     * @param startTime
     * @param endTime
     * @param shopId
     * @param shopName
     * @param pageSize
     * @param pageNum
     * @return
     */
    PageShopAccountOrderVO listOrderRefundInfo(Date startTime, Date endTime, Long shopId, String shopName, Integer pageSize, Integer pageNum);
}
